package com.tdd.mockexample;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class LoginServiceTest {
	private Account account;
	private AccountRepoisitory repository;
	private LoginService loginService;

	@Before
	public void init() {
		account = mock(Account.class);
		repository = mock(AccountRepoisitory.class);
		loginService = new LoginService(repository);
	}

	private void setAccountPasswordMatchesTo(Account account, boolean state) {
		when(account.passwordMatches(anyString())).thenReturn(state);
	}
	
	@Test
	public void loginWithIncorrectPasswordDoesNotLoginAcocunt() {
		when(repository.findAccountNamed(anyString())).thenReturn(account);
		setAccountPasswordMatchesTo(account, false);

		loginService.login("account", "password");
	}

	@Test
	public void loginWithCorrectPasswordAndAccount() {
		when(repository.findAccountNamed(anyString())).thenReturn(account);
		setAccountPasswordMatchesTo(account, true);

		loginService.login("account", "password");

		verify(account, times(1)).setLoggedIn(true);
	}
}
